<?php
/**
 * Excel处理类
 */
namespace app\addon;
use app\initcore\Appreturn;

class Excel{
    /**
     * 导出Excel
     * @param int $total 文档数据总数
     * @param array $list 文档数据
     * @param string $ftppath ftp保存目录
     * @param string $filename 保存文件名
     * @param string $path 本地保存目录
     * @param string $creator 作者
     * @param string $modified 最后一次保存者
     * @param string $title 标题
     * @param string $subject 主题
     * @param string $description 备注
     * @param string $keywords 标记
     * @param string $category 类别
     * @return void
     */
    public static function exportExcel($total, $list, $ftppath = 'car_id_info', $filename = '', $path = '', $creator = 'creator', $modified = 'modified', $title = 'title', $subject = 'subject', $description = 'description', $keywords = 'keywords', $category = 'category'){
        if(empty($list)) Appreturn::errorReturn(ERR_PARAM_ERROR, '导出数据不能为空！');
        
        if(empty($ftppath)) Appreturn::errorReturn(ERR_PARAM_ERROR, 'ftp保存目录不能为空！');
        $ftppath = '/' . $ftppath . '/' . date('Ym') . '/';
        
        vendor('PHPExcel.PHPExcel');//引入PHPExcel
        $objPHPExcel = new \PHPExcel();//实例PHPExcel化对象
        
        //设置文档属性
        $objPHPExcel->getProperties()
        ->setCreator($creator)//作者
        ->setLastModifiedBy($modified)//最后一次保存者
        ->setTitle($title)//标题
        ->setSubject($subject)//主题
        ->setDescription($description)//备注
        ->setKeywords($keywords)//标记
        ->setCategory($category);//类别
        
        //重命名工作表
        $objPHPExcel->getActiveSheet()->setTitle($title);
        
        //将活动表索引设置为第一页，即将此表作为第一页 
        $objPHPExcel->setActiveSheetIndex(0);
        
        //Excel列编号集合
        $cell = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ');
        
        if(count($list[0]) > count($cell)) Appreturn::errorReturn(ERR_PARAM_ERROR, '导出数据字段数多于当前Excel表格设置的列表数！');
        //添加文档数据
        $i = 1;
        foreach($list as $v){
            $j = 0;
            foreach($v as $vv){
                $objPHPExcel->getActiveSheet()->getColumnDimension($cell[$j])->setWidth(20);//设置宽
                $objPHPExcel->getActiveSheet()->getStyle($cell[$j] . $i)->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中
                $objPHPExcel->getActiveSheet()->getStyle($cell[$j] . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);//居右
                $objPHPExcel->getActiveSheet()->getStyle($cell[$j] . $i)->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_TEXT);//设置单元格格式为文本
                $objPHPExcel->setActiveSheetIndex(0)->setCellValueExplicit($cell[$j] . $i, $vv, \PHPExcel_Cell_DataType::TYPE_STRING);//赋值  设置单元格格式为 字符类型
                $j++;
            }
            $i++;
        }
        //$objPHPExcel->setActiveSheetIndex(0)->fromArray($list);
        
        $objPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(19);//设置所有单元格的高
        
        $filename = empty($filename) ? createGuid() : $filename;
        $path = empty($path) ? dirname(__DIR__) . '/upload/' : $path;
        $filetype = 'xlsx';
        $filepath = $path . date('Ymd') . '/';//保存文件目录
        $filepathname = $filepath . $filename . '.' . $filetype;//保存文件目录及名称
        //检测目录
        if(!is_dir($path)){
            if(!mkdir($path) || !is_writeable($path)){
                Applog::errorLog([
                    'info' => '文件保存目录创建失败或不可写！',
                ], __FILE__, __LINE__);
                Appreturn::errorReturn(ERR_PARAM_ERROR, '导出失败！');
            }
        }
        if(!is_dir($filepath)){
            if(!mkdir($filepath) || !is_writeable($filepath)){
                Applog::errorLog([
                    'info' => '文件保存目录创建失败或不可写！',
                ], __FILE__, __LINE__);
                Appreturn::errorReturn(ERR_PARAM_ERROR, '导出失败！');
            }
        }
        
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
        $objWriter->save($filepathname);
        
        if(!file_exists($filepathname)){
            //保存的文件不存在
            Applog::errorLog([
                'info' => '保存的Excel文件不存在！',
            ], __FILE__, __LINE__);
            Appreturn::errorReturn(ERR_PARAM_ERROR, '导出失败！');
        }
        //FTP上传
        $fileinfo = array(
            'file_total_size' => filesize($filepathname),
            'file_path_name' => $filepathname,
        );
        $ftpinfo = Fileupload2::otaupload('', $ftppath, $fileinfo);
        
        if($ftpinfo['error'] == '20010000'){
            //删除临时文件
            unlink($filepathname);
            $data['path'] = FILE_DOMAIN_URL . $ftpinfo['path'];
            $data['total'] = $total;
            Appreturn::errorReturn(ERR_RETURN_OK, '导出成功！', $data);
        }else{
            //删除临时文件
            unlink($filepathname);
            Applog::errorLog([
                'info' => 'FTP上传失败！',
                'ftp-error' => $ftpinfo,
            ], __FILE__, __LINE__);
            Appreturn::errorReturn(ERR_PARAM_ERROR, '导出失败！');
        }
    }
    
    /**
     * 导入Excel，调用之前先验证导入文件格式
     * @param string $file 文件地址
     * @return array 导入的文档数据
     */
    public static function importExcel($file){
        if(!file_exists($file)){
            Appreturn::errorReturn(ERR_PARAM_ERROR, '导入文件不存在！');
        }
        vendor('PHPExcel.PHPExcel.IOFactory');//引入PHPExcel
        try{
            $objPHPExcel = \PHPExcel_IOFactory::load($file);
        }catch(\Exception $e){
            Applog::errorLog([
                'info' => 'PHPExcel加载文件出错！',
                'catch-error' => $e->getMessage(),
            ], __FILE__, $e->getLine());
            Appreturn::errorReturn(ERR_PARAM_ERROR, '导入失败！' . $e->getMessage());
        }
        $sheetData = $objPHPExcel->getActiveSheet()->toArray(null, true, true, true);
        return $sheetData;
    }
}
?>